#include"Thread.h"
#include"CurrentThread.h"
#include<semaphore.h>
std::atomic_int Thread::numCreated_(0);
Thread::Thread(ThreadFunc func,const std::string &name)
    :started_(false)
    ,joined_(false)
    ,tid_(0)
    ,func_(std::move(func))
    ,name_(name)
{
    setDefaultName();
}
Thread::~Thread()
{
    if(started_ && !joined_)
    {
        thread_->detach();//thread类提供设置分离线程的方法
    }
}

void Thread::start()//一个thread对象记录的就是一个新线程的详细信息
{
    started_=true;
    sem_t sem;
    sem_init(&sem,false,0);
    
    //开启线程
    thread_=std::shared_ptr<std::thread>(new std::thread([&](){

        //获取线程的tid值
        tid_=CurrentThread::tid();
        sem_post(&sem);
        func_();//开启一个新线程，专门执行该线程的函数
    }));
    //在这里必须等待获取上面新创建的线程的tid值
    sem_wait(&sem);
   /*  if(tid_>0)
    {这里不用判断我的线程的tid是否合法是否创建成功吗？还是说一定是创建成功的
    因为不成功的话，直接到获取tid值那里就坏了，不会到信号量加一那一行了

    } */
}
void Thread::join()
{
    joined_ = true;
    thread_->join();
}

void Thread::setDefaultName()
{
    int num=++numCreated_;
    if(name_.empty())
    {
        char buf[32]={0};
        snprintf(buf ,sizeof buf,"Thread%d",num);
        name_=buf;
    }
}